//
//  Face3D.cpp
//  C3W_Demo_By_Fan
//
//  Created by 范静涛 on 2024/7/23.
//

//------------------------------------------------------------------------------
//【文件名】Face3D.cpp
//【功能模块和目的】三维三角形类实现
//【开发者及日期】范静涛 2024/7/23
//【更改记录】
//------------------------------------------------------------------------------

//自身类头文件
#include "Face3D.hpp"
//Point3D类所属头文件
#include "Point3D.hpp"
//std::sqrt所属头文件
#include <cmath>

//------------------------------------------------------------------------------
//必要的构造、析构、赋值行为
//------------------------------------------------------------------------------

//函数名：Face3D
//功能：带参构造函数。根据P1、P2和P3，手动触发基类带参构造函数。
//     如P1、P2、P3有重复，基类构造抛出异常
//入口参数：const Point3D& P1, const Point3D& P2, const Point3D& P3
//出口参数：无
//返回值：无
Face3D::Face3D(const Point3D& P1, const Point3D& P2, const Point3D& P3) 
: Element3D_FixedPoints(std::vector<Point3D>{P1, P2, P3}, 3){
}
//------------------------------------------------------------------------------

//函数名：Face3D
//功能：拷贝构造函数
//入口参数：const Face3D& Source
//出口参数：无
//返回值：无
Face3D::Face3D(const Face3D& Source) : Element3D_FixedPoints(Source) {
}
//------------------------------------------------------------------------------

//函数名：operator=
//功能：赋值运算符override
//入口参数：const Face3D& Source
//出口参数：无
//返回值：无
Face3D& Face3D::operator=(const Face3D& Source){
    if (this != &Source) {
        Element3D_FixedPoints::operator=(Source);
    }
    return *this;
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//非静态Getter成员函数：需检查所有Getter是否有后置const
//------------------------------------------------------------------------------

//函数名：Area const
//功能：求面积override
//入口参数：无
//出口参数：无
//返回值：三角形面积
double Face3D::Area() const{
    double a = (Points[0] - Points[1]).Length();
    double b = (Points[1] - Points[2]).Length();
    double c = (Points[0] - Points[2]).Length();
    double p = (a + b + c) * 0.5;
    return sqrt(p * (p - a) * (p - b) * (p - c));
}
//------------------------------------------------------------------------------

//函数名：Length const
//功能：求长度override
//入口参数：无
//出口参数：无
//返回值：任两点间距离之和
double Face3D::Length() const{
    return (Points[0] - Points[1]).Length()
         + (Points[1] - Points[2]).Length()
         + (Points[0] - Points[2]).Length();
}
//------------------------------------------------------------------------------
